//package org.example;
//
//import lombok.extern.slf4j.Slf4j;
//import org.example.entity.CustomerInfo;
//import org.example.entity.CustomerOrder;
//import org.example.entity.CustomerRepayPlan;
//import org.example.generator.DataGenerator;
//import org.springframework.boot.CommandLineRunner;
//import org.springframework.boot.SpringApplication;
//import org.springframework.boot.autoconfigure.SpringBootApplication;
//
//import java.math.BigDecimal;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * 测试新的数据生成器
// */
//@Slf4j
//@SpringBootApplication
//public class TestNewDataGenerator implements CommandLineRunner {
//
//    public static void main(String[] args) {
//        SpringApplication.run(TestNewDataGenerator.class, args);
//    }
//
//    @Override
//    public void run(String... args) throws Exception {
//        log.info("开始测试新的数据生成器");
//
//        try {
//            // 生成完整数据集
//            DataGenerator.DataGenerationResult result = DataGenerator.generateCompleteDataSet();
//
//            List<CustomerInfo> customers = result.getCustomers();
//            List<CustomerOrder> orders = result.getOrders();
//            List<CustomerRepayPlan> repayPlans = result.getRepayPlans();
//
//            log.info("生成数据统计:");
//            log.info("客户数量: {}", customers.size());
//            log.info("订单数量: {}", orders.size());
//            log.info("还款计划数量: {}", repayPlans.size());
//
//            // 分析产品分布
//            Map<String, Long> productDistribution = orders.stream()
//                    .collect(Collectors.groupingBy(CustomerOrder::getProductName, Collectors.counting()));
//            log.info("产品分布: {}", productDistribution);
//
//            // 分析订单状态分布
//            Map<String, Long> statusDistribution = orders.stream()
//                    .collect(Collectors.groupingBy(CustomerOrder::getStatus, Collectors.counting()));
//            log.info("订单状态分布: {}", statusDistribution);
//
//            // 计算总放款金额
//            BigDecimal totalLoanAmount = orders.stream()
//                    .map(CustomerOrder::getLoanAmount)
//                    .reduce(BigDecimal.ZERO, BigDecimal::add);
//            log.info("总放款金额: {}", totalLoanAmount);
//
//            // 计算在途余额
//            BigDecimal outstandingAmount = orders.stream()
//                    .filter(order -> "未结清".equals(order.getStatus()))
//                    .map(CustomerOrder::getRemainPayAmount)
//                    .reduce(BigDecimal.ZERO, BigDecimal::add);
//            log.info("在途余额: {}", outstandingAmount);
//
//            // 分析浩瀚小贷的在途余额
//            BigDecimal haohanOutstanding = orders.stream()
//                    .filter(order -> "浩瀚小贷".equals(order.getProductName()) && "未结清".equals(order.getStatus()))
//                    .map(CustomerOrder::getRemainPayAmount)
//                    .reduce(BigDecimal.ZERO, BigDecimal::add);
//            log.info("浩瀚小贷在途余额: {}", haohanOutstanding);
//
//            // 分析还款计划状态
//            Map<String, Long> repayStatusDistribution = repayPlans.stream()
//                    .collect(Collectors.groupingBy(CustomerRepayPlan::getRepayStatus, Collectors.counting()));
//            log.info("还款计划状态分布: {}", repayStatusDistribution);
//
//            // 分析逾期情况
//            long overdueCount = repayPlans.stream()
//                    .filter(plan -> "逾期".equals(plan.getRepayStatus()))
//                    .count();
//            double overdueRate = (double) overdueCount / repayPlans.size() * 100;
//            log.info("逾期期数: {}, 逾期率: {:.2f}%", overdueCount, overdueRate);
//
//            // 分析月度分布
//            Map<String, Long> monthlyDistribution = orders.stream()
//                    .collect(Collectors.groupingBy(
//                            order -> order.getFrTime().substring(0, 7), // 提取年月
//                            Collectors.counting()));
//            log.info("月度订单分布: {}", monthlyDistribution);
//
//            // 验证Vintage逾期率
//            validateVintageRate(orders, repayPlans);
//
//            log.info("数据生成器测试完成");
//
//        } catch (Exception e) {
//            log.error("测试过程中发生异常", e);
//        }
//    }
//
//    /**
//     * 验证Vintage逾期率
//     */
//    private void validateVintageRate(List<CustomerOrder> orders, List<CustomerRepayPlan> repayPlans) {
//        log.info("开始验证Vintage逾期率");
//
//        // 按Vintage（放款月份）分组
//        Map<String, List<CustomerOrder>> vintageGroups = orders.stream()
//                .collect(Collectors.groupingBy(order -> order.getFrTime().substring(0, 7)));
//
//        for (Map.Entry<String, List<CustomerOrder>> entry : vintageGroups.entrySet()) {
//            String vintage = entry.getKey();
//            List<CustomerOrder> vintageOrders = entry.getValue();
//
//            // 计算该Vintage的逾期率
//            long totalPlans = repayPlans.stream()
//                    .filter(plan -> vintageOrders.stream()
//                            .anyMatch(order -> order.getOrderNo().equals(plan.getOrderNo())))
//                    .count();
//
//            long overduePlans = repayPlans.stream()
//                    .filter(plan -> "逾期".equals(plan.getRepayStatus()) &&
//                            vintageOrders.stream()
//                                    .anyMatch(order -> order.getOrderNo().equals(plan.getOrderNo())))
//                    .count();
//
//            if (totalPlans > 0) {
//                double vintageOverdueRate = (double) overduePlans / totalPlans * 100;
//                log.info("Vintage {}: 总期数={}, 逾期期数={}, 逾期率={:.2f}%",
//                        vintage, totalPlans, overduePlans, vintageOverdueRate);
//            }
//        }
//    }
//}
